Skip to content

events: avoid cloning listeners array on every emit#62261

Open
gurgunday wants to merge 1 commit intonodejs:mainfrom
gurgunday:perf/ee-emit-copy
Open

events: avoid cloning listeners array on every emit#62261
gurgunday wants to merge 1 commit intonodejs:mainfrom
gurgunday:perf/ee-emit-copy

Conversation

@gurgunday
Copy link
Member

@gurgunday gurgunday commented Mar 15, 2026

This PR does 2 improvements:

  • Do not clone the listeners on each emit, clone when we're either adding or removing listeners
  • Even when we're adding or removing listeners, if we're not currently emitting, avoid cloning again

Results:

Branch:

./node benchmark/run.js --filter ee-emit events
events/ee-emit.js
events/ee-emit.js listeners=1 argc=0 n=2000000: 91,903,668.22922815
> events/ee-emit.js listeners=5 argc=0 n=2000000: 31,178,549.48221315
> events/ee-emit.js listeners=10 argc=0 n=2000000: 18,218,586.602051415
events/ee-emit.js listeners=1 argc=2 n=2000000: 97,625,065.27455927
> events/ee-emit.js listeners=5 argc=2 n=2000000: 30,786,518.583512284
> events/ee-emit.js listeners=10 argc=2 n=2000000: 17,759,695.723843552
events/ee-emit.js listeners=1 argc=4 n=2000000: 95,971,210.17248763
> events/ee-emit.js listeners=5 argc=4 n=2000000: 30,290,753.36889973
> events/ee-emit.js listeners=10 argc=4 n=2000000: 17,108,737.480991445
events/ee-emit.js listeners=1 argc=10 n=2000000: 93,870,086.24126433
> events/ee-emit.js listeners=5 argc=10 n=2000000: 28,639,532.56158767
> events/ee-emit.js listeners=10 argc=10 n=2000000: 16,616,102.896280617

main:

./node benchmark/run.js --filter ee-emit events
events/ee-emit.js
events/ee-emit.js listeners=1 argc=0 n=2000000: 92,364,529.17596893
> events/ee-emit.js listeners=5 argc=0 n=2000000: 29,932,147.413670897
> events/ee-emit.js listeners=10 argc=0 n=2000000: 15,313,442.157135993
events/ee-emit.js listeners=1 argc=2 n=2000000: 98,371,745.94257125
> events/ee-emit.js listeners=5 argc=2 n=2000000: 29,668,674.924437966
> events/ee-emit.js listeners=10 argc=2 n=2000000: 15,159,257.397702452
events/ee-emit.js listeners=1 argc=4 n=2000000: 96,956,966.8137633
> events/ee-emit.js listeners=5 argc=4 n=2000000: 29,187,937.01091416
> events/ee-emit.js listeners=10 argc=4 n=2000000: 14,862,263.968670348
events/ee-emit.js listeners=1 argc=10 n=2000000: 94,272,546.83507264
> events/ee-emit.js listeners=5 argc=10 n=2000000: 27,359,329.00041816
> events/ee-emit.js listeners=10 argc=10 n=2000000: 11,452,222.952059666

@nodejs-github-bot nodejs-github-bot added events Issues and PRs related to the events subsystem / EventEmitter. needs-ci PRs that need a full CI run. labels Mar 15, 2026
@gurgunday gurgunday added the performance Issues and PRs related to the performance of Node.js. label Mar 15, 2026
@codecov
Copy link

codecov bot commented Mar 15, 2026

Codecov Report

❌ Patch coverage is 93.33333% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.67%. Comparing base (8ccbe8e) to head (d335209).
⚠️ Report is 7 commits behind head on main.

Files with missing lines Patch % Lines
lib/events.js 93.33% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #62261      +/-   ##
==========================================
- Coverage   89.68%   89.67%   -0.02%     
==========================================
  Files         676      676              
  Lines      206495   206582      +87     
  Branches    39537    39559      +22     
==========================================
+ Hits       185204   185246      +42     
- Misses      13435    13459      +24     
- Partials     7856     7877      +21     
Files with missing lines Coverage Δ
lib/events.js 99.59% <93.33%> (-0.24%) ⬇️

... and 42 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Member

@mertcanaltin mertcanaltin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@atlowChemi
Copy link
Member

@nodejs/events cc

@atlowChemi atlowChemi added the needs-benchmark-ci PR that need a benchmark CI run. label Mar 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

events Issues and PRs related to the events subsystem / EventEmitter. needs-benchmark-ci PR that need a benchmark CI run. needs-ci PRs that need a full CI run. performance Issues and PRs related to the performance of Node.js.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants